﻿/*
 * SharpDevelop으로 작성되었습니다.
 * 사용자: 2120
 * 날짜: 2012-09-27
 * 시간: 오전 4:13
 * 
 * 이 템플리트를 변경하려면 [도구->옵션->코드 작성->표준 헤더 편집]을 이용하십시오.
 */
using System;
using System.Windows.Forms;
using System.Collections;

namespace PicturePicking.Picking
{
	/// <summary>
	/// 이미지를 선택하고, 노드를 추가,제거 할 수있는 포괄적인 객체를 생성합니다.
	/// </summary>그
	public class PictureManager : IPickable, IDrawable
	{
		protected PictureBox picture = null;	//PictureBox 컨트롤
		protected IPickable picker = null;		//IPickable의 멤버 변수
		protected ArrayList pickList = null;	//IPickable의 리스트
		
		/// <summary>
		/// IPickedable의 리스트를 가져옵니다.
		/// </summary>
		public ArrayList GetPickList
		{
			get
			{
				return pickList;
			}
		}
		
		/// <summary>
		/// PicktureBox의 Picking을 담당하는 객체를 만듭니다.
		/// </summary>
		/// <returns>생성된 객체가 반환됩니다.</returns>
		public static PictureManager Create()
		{
			return new PictureManager();
		}
		
		/// <summary>
		/// Pick을 할 좌표를 대입하여 실제 오브젝트가 있는지 없는지를 확인합니다.
		/// </summary>
		/// <returns> pick을 당한 객체입니다. </returns>
		public IPickedable Pick(int x,int y)
		{
			return picker.Pick(x,y);
		}
		
		/// <summary>
		/// 실제 화면에 그려질 PictureBox 컨트롤입니다.
		/// </summary>
		public void SetPictureBox(PictureBox p)
		{
			picture = p;
		}
		
		/// <summary>
		/// Pick을 담당하는 객체를 대입합니다.
		/// </summary>
		/// <param name="p">IPickable을 구현한 인스턴스 객체입니다.</param>
		public void SetPicker(IPickable p)
		{
			picker = p;
		}
		
		/// <summary>
		/// Pick을 당하는 객체를 추가합니다.
		/// </summary>
		/// <param name="p"> IPickedable을 구현한 인스턴스 객체입니다. </param>
		public void Add(IPickedable p)
		{
			pickList.Add(p);
		}
		
		public void Remove(IPickedable p)
		{
			lock(pickList){
				pickList.Remove(p);
			}
		}
		
		/// <summary>
		/// 리스트에 있는 객체를 그립니다.
		/// </summary>
		public void Draw(Object o)
		{
			foreach(IDrawable pick in pickList)
			{
				pick.Draw(o);
			}
		}
		
		protected PictureManager()
		{
			pickList = new ArrayList();
		}
	}
}
